package com.zsr.utils;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.alibaba.druid.pool.DruidPooledConnection;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;

/**
 * Jdbc工具类
 * 获取数据库连接和关闭连接
 */
public class JdbcUtils {

    /**
     * Druid 是阿里巴巴开源平台上一个数据库连接池实现，
     * 结合了 C3P0、DBCP、PROXOOL 等 DB 池的优点，同时加入了日志监控
     * */
    private static DruidDataSource dataSource;
    private static ThreadLocal<Connection> conns=new ThreadLocal<>();

    static {
        /**
         * Properties 类位于 java.util.Properties ，是Java 语言的配置文件所使用的类， Xxx.properties 为Java 语言常见的配置文件，如数据库的配置 jdbc.properties, 系统参数配置 system.properties。 这里，讲解一下Properties 类的具体使用。
         * 以key=value 的 键值对的形式进行存储值。 key值不能重复。
         * */
        Properties properties=new Properties();

        try {
            //读取jdbc.properties 属性配置文件
            InputStream resourceAsStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");

            //从流中加载数据
            properties.load(resourceAsStream);
            //properties.list(System.out);//打印输出

            //把key值转换成set 的形式，遍历set
//            Set<String> names = properties.stringPropertyNames();
//            Iterator<String> iterator=names.iterator();
//            while(iterator.hasNext()){
//                String key=iterator.next();
//                String value=properties.getProperty(key);
//                System.out.println(key+"="+value);
//            }

            // 创建 数据库连接池
            //DataSource用来取代DriverManager来获取Connection，获取速度快，同时可以大幅度提高数据库访问速
            //度。
            dataSource= (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);

            System.out.println(dataSource.getConnection());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    /**
     * 获取数据库连接池中的连接
     * @return 如果返回null，说明获取连接失败
     */
    public  static Connection getConnection(){
       Connection conn =conns.get();
        if(conn==null){
            try {
                conn=dataSource.getConnection();
                conns.set(conn);
                conn.setAutoCommit(false);//设置为手动管理事务
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return conn;
       /*
       //旧写法
       Connection conn=null;
        try {
            conn = dataSource.getConnection();

        }catch (Exception e){
            e.printStackTrace();
        }
        return conn;*/
    }

    /**
     * 提交事务，并关闭释放连接
     */
    public static void commitAndClose(){
        Connection connection = conns.get();
        if(connection!=null){//如果不等于null，说明之前使用过连接，操作过数据库
            try {
                connection.commit();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                try {
                    connection.close();//关闭连接
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        //一定要remove操作，否则会出错（因为Tomcat服务器底层使用了线程池技术）
        conns.remove();
    }

    public static void rollbackAndClose(){
        Connection connection = conns.get();
        if(connection!=null){//如果不等于null，说明之前使用过连接，操作过数据库
            try {
                connection.rollback();//事务回滚
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                try {
                    connection.close();//关闭连接
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        //一定要remove操作，否则会出错（因为Tomcat服务器底层使用了线程池技术）
        conns.remove();
    }


    /**
     * 关闭连接，放回数据库连接池
     * @param conn
     */
    /*public static void close(Connection conn){
        if(conn!=null){
            try {
                conn.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }*/
}
